// 声明一个变量没有给类型的时候，默认类型是any

let name = 'js' //等号左边的类型 可以通过右边自动推导  此时就不用添加类型了

// const let去呗  const意味着值不能发生变化  类型范围更小  let可以改变值，会推断的范围大

// 联合类型 在没有确定值之前 ，只能采用联合类型中的方法  只有确定特定类型后，才能使用对应的方法
let strOrNum:string | number
// !非空断言
strOrNum!.toString()
function fn(strOrNum:string | number){
    // 联合类型的值，只能使用公有的属性
    strOrNum.toString()
}

// 非空断言
let ele = document.getElementById('root')
// 不能给可选连赋值
ele?.style.background = 'red'
// ! 认定这个元素一定有值
ele!.style.background ='red'

// ?? || 
null || 'a'




let strOrNum1:string | number
// 类型断言
(strOrNum1! as string).toLocaleLowerCase()
let strOrNum2:string | number
// 一般不用
(<number>strOrNum2!).toFixed(2)

// 断言只能断言成一个已经存在的类型 如果不存在不能直接断言
let strOrNum3:string | number
strOrNum3! as any as boolean
// 断言：我们可以自己制定特定的类型




// 字面量类型
const userName:'js' = 'js'
const passwoer:212 = 212

// 字面量类型和联合类型 放在一起用  就更加灵活了

// type关键字和enum都是ts提供的
type Direction = 'up'|'down'|'left'|'right'
let direction:Direction = 'up' //字面量类型 就是限定了值 和 枚举类似
export{}